<?php

namespace App\Controllers\Push;

use JPush\Client as JPush;
use JPush\Exceptions\APIConnectionException;
use JPush\Exceptions\APIRequestException;
use \App\Libs\Base\Config;
use \App\Models\City\City;

class Push extends \App\Libs\Base\BaseAction
{


    protected function beforeRun()
    {
        parent::beforeRun();
//        $this->needLogin = TRUE;
    }

    /*
     * 参数：  必须：content：推送的内容；
     *
     * 可选：
     * 标题：                       title：默认为“派乐熊”；
     * 离线消息保留时间：             wait_time: 范围1--10；单位天，默认1
     * 推送等待时间：                sent_time   立刻推送不要此字段，否则填入数字，最大1400，最小1
     * 推送的城市列表：               city_list   城市列表；其值为城市名称；
     * */
    public function execute()
    {
        if ($this->request->isPost() == true) {
            if (!$this->request->hasPost('content')) {
                return \App\Libs\Views\Json::view(1, '推送什么内容？', []);
            }
            $content = $this->request->getPost('content');
            //标题
            $title = $this->request->getPost('title', 'string', '派乐熊');
            //离线消息保留时间
            $day = $this->request->getPost('wait_time', 'int', 1);
            $jpushInfo = Config::instance()->jpush['jpush'];
            $JPush = new JPush($jpushInfo['app_key'], $jpushInfo['master_secret'], null);
            $pushPayLoad = $JPush->push();
            //接受平台；
            $pushPayLoad->setPlatform(array('android', 'ios'));


            //接受通知人；-------------------------
            //根据城市发通知；
            if ($this->request->hasPost('city_list')) {
                $allServeCity = City::findAll();
                $serverCity = [];
                if ($allServeCity->valid()) {
                    $allServeCity->rewind();
                    while ($allServeCity->valid()) {
//                       $allServeCity->current()->id
                        $serverCity[] = $allServeCity->current()->city_name;
                        $allServeCity->next();
                    }
                }
                $serverCity = array_intersect($this->request->getPost('city_list'), $serverCity);
                //给集合的城市发消息；
                $pushPayLoad->addTag($serverCity);
            } else {
                //发所有人，其他再加
                $pushPayLoad->addAllAudience();
            }


            //------------------------------------
            $pushPayLoad->androidNotification($content, array(
                'title' => $title,
                // 'builder_id' => 2,
                'extras' => array(),
            ));
            $pushPayLoad->iosNotification($content, array(
                'sound' => '',
                // 'badge' => '+1',
                // 'content-available' => true,
                // 'mutable-content' => true,
                //'category' => 'jiguang',
                'extras' => array(),
            ));
            $pushPayLoad->options(array(
                // sendno: 表示推送序号，纯粹用来作为 API 调用标识，
                // API 返回时被原样返回，以方便 API 调用方匹配请求与返回
                // 这里设置为 100 仅作为示例

                // 'sendno' => 100,

                // time_to_live: 表示离线消息保留时长(秒)，
                // 推送当前用户不在线时，为该用户保留多长时间的离线消息，以便其上线时再次推送。
                // 默认 86400 （1 天），最长 10 天。设置为 0 表示不保留离线消息，只有推送当前在线的用户可以收到
                // 这里设置为 1 仅作为示例

                'time_to_live' => $day,

                // apns_production: 表示APNs是否生产环境，
                // True 表示推送生产环境，False 表示要推送开发环境；如果不指定则默认为推送生产环境

                'apns_production' => False,
            ));
            if ($this->request->hasPost('sent_time')) {
                $pushPayLoad->options(array(
                    // big_push_duration: 表示定速推送时长(分钟)，又名缓慢推送，把原本尽可能快的推送速度，降低下来，
                    // 给定的 n 分钟内，均匀地向这次推送的目标用户推送。最大值为1400.未设置则不是定速推送
                    // 这里设置为 1 仅作为示例
                    'big_push_duration' => $this->request->getPost('sent_time', 'int', 1)
                ));
            }
            try {
                $response = $pushPayLoad->send();
                if (isset($response['body']['sendno']) && isset($response['body']['msg_id'])) {
                    return \App\Libs\Views\Json::view(0, '消息推送成功!', []);
                } else {
                    return \App\Libs\Views\Json::view(1, '消息推送失败!,稍后重试', []);
                }
            } catch (APIConnectionException $e) {
                $msg = var_export($e, true);
                return \App\Libs\Views\Json::view(1, '推送失败请重试', ['errorMsg' => $msg]);
            } catch (APIRequestException $e) {
                $msg = var_export($e, true);
                return \App\Libs\Views\Json::view(1, '推送失败，请根据错误提示从新选择！', ['errorMsg' => $msg]);
            }
        } else {
            $allServeCity = City::findAll();
            $serverCity = [];
            if ($allServeCity->valid()) {
                $allServeCity->rewind();
                while ($allServeCity->valid()) {
//                       $allServeCity->current()->id
                    $serverCity[] = $allServeCity->current()->city_name;
                    $allServeCity->next();
                }
            }
            //返回所有服务城市；
            return \App\Libs\Views\Json::view(0, '成功', ['city_list' => $serverCity]);
        }

    }


    public function pushToSomeOne()
    {
        //推送给某人只需要把
    }


}
